Bu sorunun zaten burada cevapları var: Aşırı yüklenmiş operatörde örtük dönüştürme yok (2 cevap) 7 yıl önce kapalı. Basit bir tür için basit bir sarmalayıcı yazıyorum ve çok fazla çeşit standart işleç yazmaktan kaçınmaya çalışıyorum. Örtük tür dönüşümünün yardımcı olacağını umuyordum, ancak olmuyor. İşte basitleştirilmiş bir örnek: struct Int { int _i; Int (int i = 0): _i {i} {} Int operatörü + (const Int & rhs) {return _i + rhs._i;} }; int main (int argc, char * argv []) { (geçersiz) (Int (1) + 2); // İyi (geçersiz) (2 + Int (1)); // hata: ikili ifadeye geçersiz işlenenler ('int' ve 'Int') } Llvm kullanıyorum. Main'ın ilk satırı iyi derler. İkincisi bir hataya neden olur. Şimdi, ikinci satırda olmasını umduğum şey, 2'nin dolaylı olarak Int (2) 'ye dönüştürülmesi ve ardından + operatörüne çağrı yapılmasıdır. Bu neden olmuyor? Neden ilk satırda örtük dönüşüm gerçekleşiyor?
2021-03-01 08:20:15
İlk satırda gerçekleşir çünkü + kullanılabilir tek operatör + (Int &) operatörüdür (bu örnek için Int'in örtük ilk parametresine sahiptir). İkinci satır başarısız olur çünkü ilk parametre bir inttir ve işlemi denemeden önce onu dönüştürmesi gerektiğine dair hiçbir ipucu yoktur (Int :: operator + kullanması gerektiğini bilmez). Operatörü üye olmayan bir arkadaş işlevi yaparak bu sorunu önleyebilirsiniz (http://ideone.com/YCf7wX) struct Int { int _i; Int (int i = 0): _i {i} {} arkadaş Int operatörü + (const Int & lhs, const Int & rhs); }; Int operatörü + (const Int & lhs, const Int & rhs) { dönüş lhs._i + rhs._i; } int main () { Int i; i + 5; 5 + i; dönüş 0; } | Aradığın cevap değil mi? C ++ operatörü-anahtar kelimesi örtük dönüştürme etiketli diğer sorulara göz atın veya kendi sorunuzu sorun.